/* eslint valid-jsdoc: "off" */

'use strict';

/**
 * @param {Egg.EggAppInfo} appInfo app info
 */
module.exports = appInfo => {
  /**
   * built-in config
   * @type {Egg.EggAppConfig}
   **/
  const config = exports = {};
  // use for cookie sign key, should change to your own and keep security
  config.keys = appInfo.name + '_1584154855930_5350';
  // add your middleware config here 中间件
  /**
   * enable：控制中间件是否开启。
   match：设置只有符合某些规则的请求才会经过这个中间件。
           字符串：当参数为字符串类型时，配置的是一个 url 的路径前缀，所有以配置的字符串作为前缀的 url 都会匹配上。 当然，你也可以直接使用字符串数组。
           正则：当参数为正则时，直接匹配满足正则验证的 url 的路径。
           函数：当参数为一个函数时，会将请求上下文传递给这个函数，最终取函数返回的结果（true/false）来判断是否匹配。
   ignore：设置符合某些规则的请求不经过这个中间件。
   * @type {string[]}
   */
  config.middleware = [
    'robot',
    'gzip'
  ];
  // 静态文件
  config.view = {
    defaultViewEngine: 'nunjucks',
    mapping: {
      '.tpl': 'nunjucks',
    },
  };
  // file模式 ctx.request.files[0]
  config.multipart = {
      mode: 'file',
      fileSize: '50mb',
      whitelist: [
          '.foo',
          '.apk',
          // images
          '.jpg', '.jpeg', // image/jpeg
          '.png', // image/png, image/x-png
          '.gif', // image/gif
          '.bmp', // image/bmp
          '.wbmp', // image/vnd.wap.wbmp
          '.webp',
          '.tif',
          '.psd',
          // text
          '.svg',
          '.js', '.jsx',
          '.json',
          '.css', '.less',
          '.html', '.htm',
          '.xml',
          // tar
          '.zip',
          '.gz', '.tgz', '.gzip',
          // video
          '.mp3',
          '.mp4',
          '.avi',
      ],
  }
  // 日志
  config.logger = {
        // level: 'DEBUG',
        // allowDebugAtProd: true,
        // consoleLevel: 'DEBUG',
    };

  // daemon启动配置
    config.listen= {
        daemon:true,
        env:'prod',

        port: 7002,
        hostname: '127.0.0.1', // 不建议设置 hostname 为 '0.0.0.0'，它将允许来自外部网络和来源的连接，请在知晓风险的情况下使用
        // path: '/var/run/egg.sock',
    }
  // add your user config here
  const userConfig = {
    // myAppName: 'egg',
    // 用户配置
      news : {
        pageSize: 5,
        serverUrl: 'https://hacker-news.firebaseio.com/v0',
      },
      // 配置 robot 中间件的配置
      robot : {
        ua: [
          /Baiduspider/i,
        ]
      },
      // 配置 gzip 中间件的配置
      gzip: {
        threshold: 1024, // 小于 1k 的响应体不压缩
      },
      // 默认中间件
      bodyParser: {
        jsonLimit: '10mb',
      },
      // 数据库 配置 https://mongoosejs.com/docs/api.html#mongoose_Mongoose-createConnection
      mongoose: {
        client:{
            url: 'mongodb://127.0.0.1:27017/test',
            options: {
                user: 'root',
                pass: '123456',
                useNewUrlParser: true,
            },
            useUnifiedTopology: true  //daemon开始的时候需要配置这个
        },
        app: true,
        // // 是否加载到 agent 上，默认关闭
        agent: false,
          // 这里为了更好看到报什么错
          onerror: {
              all(err, ctx) {
                  // 在此处定义针对所有响应类型的错误处理方法
                  // 注意，定义了 config.all 之后，其他错误处理方法不会再生效
                  ctx.body = err;
                  ctx.status = 500;
              },
              html(err, ctx) {
                  // html hander
                  ctx.body = err;
                  ctx.status = 500;
              },
              json(err, ctx) {
                  // json hander
                  ctx.body = { message: JSON.stringify(err && err.message || err) };
                  ctx.status = 500;
              },
              jsonp(err, ctx) {
                  // 一般来说，不需要特殊针对 jsonp 进行错误定义，jsonp 的错误处理会自动调用 json 错误处理，并包装成 jsonp 的响应格式
              },
          },
      },

  };
  return {
    ...config,
    ...userConfig,
  };
};
